/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Profesionales;

import clienteSandraParada.Login;
import clienteSandraParada.Mensajeria;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import componentes.Rut;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

/**
 * El objetivo de esta clase es mostrar el formulario con los datos requeridos
 * para registrar un ProfesionalExterno en el Sistema.
 *
 * @author Franzel
 */
public class DialogoInfoProfesionalExterno extends javax.swing.JDialog {

    private int filaClick = -1;
    private int columnaClick = -1;
    private ProfesionalExterno profesional;
    private String rutAnterior;
    private String valorAnterior;

    /**
     * Constructor de la clase, recibe todos los parámetros e inicializa las
     * variables de la clase
     */
    public DialogoInfoProfesionalExterno(java.awt.Frame parent, boolean modal, ProfesionalExterno profExterno) {
        super(parent, modal);
        initComponents();
        valorAnterior = "";
        this.profesional = profExterno;

        this.setLocationRelativeTo(null);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        botonFormularioAccion = new javax.swing.JButton();
        botonFormularioSalida = new javax.swing.JButton();
        panelInfoCuenta = new javax.swing.JPanel();
        jLabel18 = new javax.swing.JLabel();
        campoEspecialidad = new javax.swing.JTextField();
        jLabel20 = new javax.swing.JLabel();
        asterisco5 = new javax.swing.JLabel();
        campoInstitucion = new javax.swing.JTextField();
        panelContacto = new javax.swing.JPanel();
        jLabel13 = new javax.swing.JLabel();
        jLabel14 = new javax.swing.JLabel();
        jLabel15 = new javax.swing.JLabel();
        campoTelefono = new componentes.Telefono();
        campoCelular = new componentes.Celular();
        campoEmail = new componentes.Correo();
        panelDatosPersonales = new javax.swing.JPanel();
        jLabel6 = new javax.swing.JLabel();
        campoApellidoPaterno = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        campoNombre = new javax.swing.JTextField();
        campoRut = new componentes.Rut();
        jLabel10 = new javax.swing.JLabel();
        campoApellidoMaterno = new javax.swing.JTextField();
        asterisco1 = new javax.swing.JLabel();
        asterisco2 = new javax.swing.JLabel();
        asterisco3 = new javax.swing.JLabel();
        asterisco4 = new javax.swing.JLabel();
        camposObligatorios = new javax.swing.JLabel();
        mensajesAdvertencia = new javax.swing.JLabel();
        unCampoObligatorio = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        botonFormularioAccion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Agregar.png"))); // NOI18N
        botonFormularioAccion.setText("Agregar");
        botonFormularioAccion.setToolTipText("Agregar");
        botonFormularioAccion.setAlignmentY(0.0F);
        botonFormularioAccion.setMaximumSize(new java.awt.Dimension(95, 25));
        botonFormularioAccion.setMinimumSize(new java.awt.Dimension(95, 25));
        botonFormularioAccion.setPreferredSize(new java.awt.Dimension(95, 25));
        botonFormularioAccion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFormularioAccionActionPerformed(evt);
            }
        });

        botonFormularioSalida.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Cancelar.png"))); // NOI18N
        botonFormularioSalida.setText("Cancelar");
        botonFormularioSalida.setToolTipText("Eliminar");
        botonFormularioSalida.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFormularioSalidaActionPerformed(evt);
            }
        });

        panelInfoCuenta.setBorder(javax.swing.BorderFactory.createTitledBorder("Informacion del profesional"));
        panelInfoCuenta.setForeground(new java.awt.Color(102, 255, 51));

        jLabel18.setText("Especialidad: ");

        jLabel20.setText("Institución proveniente:  ");

        asterisco5.setText("*");

        javax.swing.GroupLayout panelInfoCuentaLayout = new javax.swing.GroupLayout(panelInfoCuenta);
        panelInfoCuenta.setLayout(panelInfoCuentaLayout);
        panelInfoCuentaLayout.setHorizontalGroup(
            panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel18)
                    .addComponent(jLabel20, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                        .addComponent(campoEspecialidad, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(asterisco5))
                    .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                        .addComponent(campoInstitucion, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
        );
        panelInfoCuentaLayout.setVerticalGroup(
            panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel18)
                    .addComponent(campoEspecialidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(asterisco5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel20, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoInstitucion))
                .addContainerGap())
        );

        panelContacto.setBorder(javax.swing.BorderFactory.createTitledBorder("Contacto **"));
        panelContacto.setForeground(new java.awt.Color(102, 255, 51));

        jLabel13.setText("Teléfono:");

        jLabel14.setText("E-Mail:");

        jLabel15.setText("Celular:");

        javax.swing.GroupLayout panelContactoLayout = new javax.swing.GroupLayout(panelContacto);
        panelContacto.setLayout(panelContactoLayout);
        panelContactoLayout.setHorizontalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContactoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel15, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING))
                .addGap(17, 17, 17)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoCelular, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoEmail, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoTelefono, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        panelContactoLayout.setVerticalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelContactoLayout.createSequentialGroup()
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoTelefono, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoCelular, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel15))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelContactoLayout.createSequentialGroup()
                        .addComponent(jLabel14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGap(24, 24, 24))
                    .addGroup(panelContactoLayout.createSequentialGroup()
                        .addComponent(campoEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
        );

        panelDatosPersonales.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos personales"));
        panelDatosPersonales.setForeground(new java.awt.Color(102, 255, 51));

        jLabel6.setText("Rut:");

        jLabel7.setText("Apellido paterno:");

        jLabel8.setText("Nombres: ");

        jLabel10.setText("Apellido materno:");

        asterisco1.setText("*");

        asterisco2.setText("*");

        asterisco3.setText("*");

        asterisco4.setText("*");

        javax.swing.GroupLayout panelDatosPersonalesLayout = new javax.swing.GroupLayout(panelDatosPersonales);
        panelDatosPersonales.setLayout(panelDatosPersonalesLayout);
        panelDatosPersonalesLayout.setHorizontalGroup(
            panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addComponent(jLabel6)
                        .addGap(71, 71, 71)
                        .addComponent(campoRut, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(asterisco1, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel10)
                            .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jLabel7, javax.swing.GroupLayout.Alignment.LEADING)))
                        .addGap(8, 8, 8)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(campoApellidoPaterno)
                            .addComponent(campoNombre, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE)
                            .addComponent(campoApellidoMaterno))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(asterisco4, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco3, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco2, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        panelDatosPersonalesLayout.setVerticalGroup(
            panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(asterisco1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoRut, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoApellidoPaterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoApellidoMaterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDatosPersonalesLayout.createSequentialGroup()
                        .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(8, 8, 8)
                        .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        camposObligatorios.setText("* Campos obligatorios");

        mensajesAdvertencia.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        mensajesAdvertencia.setText("Área de mensajería");

        unCampoObligatorio.setText("** Al menos ingresar un campo");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(camposObligatorios)
                    .addComponent(unCampoObligatorio)
                    .addComponent(panelContacto, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelDatosPersonales, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(botonFormularioAccion, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonFormularioSalida))
                    .addComponent(panelInfoCuenta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(mensajesAdvertencia, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelDatosPersonales, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelContacto, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelInfoCuenta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(camposObligatorios, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(unCampoObligatorio, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(botonFormularioAccion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonFormularioSalida, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(mensajesAdvertencia, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Método Action Performed del boton de Accion en el formulario
     * ProfesionalExterno.
     *
     * @param variable de tipo ActionEvent con el evento del boton.
     *
     */
    private void botonFormularioAccionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFormularioAccionActionPerformed

        java.util.List<service.ProfesionalExterno> profesionalExt = this.listarProfesionalesExternos();
        boolean encontrado = false;
        //Revisa que un usuario creado no se repita

        if (validarCampos()) {
            this.dispose();
            int fila = -1;
            if (this.getTitle().equals("Agregar Profesional Externo")) {

                if (!campoRut.isValido()) {
                    cambiarEtiquetaMensajeria(Mensajeria.mensajeRutValido(), Color.red);
                    return;
                }

                for (service.ProfesionalExterno u : profesionalExt) {
                    if (u.getRut().equals(campoRut.getRut().getText())) {
                        encontrado = true;
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Profesional Externo"), Color.red);
                        return;
                    }
                }

                if (encontrado == false) {
                    cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
                    service.ProfesionalExterno pro = crearObjetoProfesionalExterno(new service.ProfesionalExterno());
                    agregarProfesionalExterno(pro);
                    //llamar bitacora
                    String valorNuevo = "Rut: " + pro.getRut() + "\n" + "Nombres: " + pro.getNombres() + "\n" + "Apellido paterno: " + pro.getApellidoPaterno() + "\n" + "Apellido materno: " + pro.getApellidoMaterno() + "\n" + "Bloque: " + pro.getBloque() + "\n" + "Calle: " + pro.getCalle() + "\n" + "Celular: " + pro.getCelular() + "\n"
                            + "Comuna: " + pro.getComuna() + "\n" + "departamento: " + pro.getDepto() + "\n" + "Email: " + pro.getEmail() + "\n" + "Especialidad:" + pro.getEspecialidad() + "\n" + "Fecha nacimiento:" + pro.getFechaNac() + "\n" + "Lugar de trabajo: " + pro.getLugarDeTrabajo() + "\n" + "Número:" + pro.getNumero() + "\n" + "porcentaje:"
                            + pro.getPorcentaje() + "\n" + "Provincia:" + pro.getProvincia() + "\n" + "Región:" + pro.getRegion() + "\n" + "Teléfono:" + pro.getTelefono();
                    registrar(Login.getUser(), "Profesional externo", "Agregó profesional externo: " + pro.getRut(), "No aplica", valorNuevo);
                    this.profesional.getjLabel5().setText(Mensajeria.mensajeDeAccion("Profesional Externo", "agregar"));
                    fila = this.profesional.getContenedorProfesionalesExternos().getRowCount();
                    DefaultTableModel modelo = (DefaultTableModel) this.profesional.getContenedorProfesionalesExternos().getModel();
                    modelo.addRow(new String[4]);
                }
            } else if (this.getTitle().equals("Modificar Profesional Externo")) {
                service.ProfesionalExterno pro = crearObjetoProfesionalExterno((service.ProfesionalExterno) cargarProfesionalExterno(campoRut.getRut().getText()));
                modificarProfesionalExterno(pro);
                String valorNuevo = "Rut: " + pro.getRut() + "\n" + "Nombres: " + pro.getNombres() + "\n" + "Apellido paterno: " + pro.getApellidoPaterno() + "\n" + "Apellido materno: " + pro.getApellidoMaterno() + "\n" + "Bloque: " + pro.getBloque() + "\n" + "Calle: " + pro.getCalle() + "\n" + "Celular: " + pro.getCelular() + "\n"
                        + "Comuna: " + pro.getComuna() + "\n" + "departamento: " + pro.getDepto() + "\n" + "Email: " + pro.getEmail() + "\n" + "Especialidad:" + pro.getEspecialidad() + "\n" + "Fecha nacimiento:" + pro.getFechaNac() + "\n" + "Lugar de trabajo: " + pro.getLugarDeTrabajo() + "\n" + "Número:" + pro.getNumero() + "\n" + "porcentaje:"
                        + pro.getPorcentaje() + "\n" + "Provincia:" + pro.getProvincia() + "\n" + "Región:" + pro.getRegion() + "\n" + "Teléfono:" + pro.getTelefono();
                registrar(Login.getUser(), "Profesional externo", "Modificó profesional externo: " + pro.getRut(), valorAnterior, valorNuevo);
                this.profesional.getjLabel5().setText(Mensajeria.mensajeDeAccion("Profesional Externo", "modificar"));
                fila = this.profesional.getContenedorProfesionalesExternos().getSelectedRow();

            } else {
                service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
                if (p.isExportarProfesionalExterno()) {
                    fila = -1;
                    try {
                        exportarPDF();
                    } catch (DocumentException ex) {
                        Logger.getLogger(DialogoInfoProfesionalExterno.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (FileNotFoundException ex) {
                        Logger.getLogger(DialogoInfoProfesionalExterno.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
                }
            }
            if (fila != -1) {
                profesional.getContenedorProfesionalesExternos().setValueAt(this.campoRut.getRut().getText(), fila, 0);
                profesional.getContenedorProfesionalesExternos().setValueAt(this.campoNombre.getText(), fila, 1);
                profesional.getContenedorProfesionalesExternos().setValueAt(this.campoApellidoPaterno.getText(), fila, 2);
                profesional.getContenedorProfesionalesExternos().setValueAt(this.campoEspecialidad.getText(), fila, 3);
                profesional.getContenedorProfesionalesExternos().setValueAt(this.campoInstitucion.getText(), fila, 4);
            }

        }

    }//GEN-LAST:event_botonFormularioAccionActionPerformed

    /**
     * Método Action Performed del boton de Salida en el formulario
     * ProfesionalExterno
     *
     * @param variable de tipo ActionEvent con el evento del boton
     *
     */
    private void botonFormularioSalidaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFormularioSalidaActionPerformed
        // TODO add your handling code here:
        this.cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
        this.dispose();
}//GEN-LAST:event_botonFormularioSalidaActionPerformed
    
    public void agregarFocusListenerRutProfesionalExterno() {
        this.cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
        campoRut.getRut().addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent fe) {
            }

            @Override
            public void focusLost(FocusEvent fe) {
                if (!campoRut.isValido()) {
                    cambiarEtiquetaMensajeria(Mensajeria.mensajeRutValido(), Color.red);
                    campoRut.getRut().requestFocus();
                } else {
                    cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
                    service.ProfesionalExterno p = (service.ProfesionalExterno) cargarProfesionalExterno(campoRut.getRut().getText());
                    if (p != null) {
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Profesional Externo"), Color.red);
                        campoRut.getRut().requestFocus();
                    }
                }
            }
        });
    }
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel asterisco1;
    private javax.swing.JLabel asterisco2;
    private javax.swing.JLabel asterisco3;
    private javax.swing.JLabel asterisco4;
    private javax.swing.JLabel asterisco5;
    public javax.swing.JButton botonFormularioAccion;
    public javax.swing.JButton botonFormularioSalida;
    private javax.swing.JTextField campoApellidoMaterno;
    private javax.swing.JTextField campoApellidoPaterno;
    private componentes.Celular campoCelular;
    private componentes.Correo campoEmail;
    private javax.swing.JTextField campoEspecialidad;
    private javax.swing.JTextField campoInstitucion;
    private javax.swing.JTextField campoNombre;
    private componentes.Rut campoRut;
    private componentes.Telefono campoTelefono;
    private javax.swing.JLabel camposObligatorios;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel mensajesAdvertencia;
    private javax.swing.JPanel panelContacto;
    private javax.swing.JPanel panelDatosPersonales;
    private javax.swing.JPanel panelInfoCuenta;
    private javax.swing.JLabel unCampoObligatorio;
    // End of variables declaration//GEN-END:variables

    public void camposObligatoriosVisibles(boolean opcion) {
        this.asterisco1.setVisible(opcion);
        this.asterisco2.setVisible(opcion);
        this.asterisco3.setVisible(opcion);
        this.asterisco4.setVisible(opcion);
        this.asterisco5.setVisible(opcion);
        this.camposObligatorios.setVisible(opcion);
        this.unCampoObligatorio.setVisible(opcion);
        this.mensajesAdvertencia.setVisible(opcion);

        if (opcion) {
            this.setSize(340, 490);
            this.panelContacto.setBorder(new TitledBorder("Contacto **"));
        } else {
            this.setSize(340, 425);
            this.panelContacto.setBorder(new TitledBorder("Contacto"));
        }
    }

    /**
     * Método que deja en blanco todos los campos del diálogo formulario.
     *
     */
    public void limpiarCampos() {
        this.campoApellidoPaterno.setText("");
        this.campoApellidoMaterno.setText("");
        this.campoCelular.getCelular().setText("");
        this.campoEspecialidad.setText("");
        this.campoEmail.getCorreo().setText("");
        this.campoNombre.setText("");
        this.campoRut.getRut().setText("");
        this.campoTelefono.getTelefono().setText("");
        this.campoInstitucion.setText("");


    }

    /**
     * Método que llena todos los campos del diálogo formulario a partir de un
     * ProfesionalExterno entregado.
     *
     * @param variable user de tipo service.ProfesionalExterno, que contiene el
     * profesional externo con el que se llenaran los campos
     *
     */
    public void llenarCampos(service.ProfesionalExterno profExterno) {
        valorAnterior = "Rut: " + profExterno.getRut() + "\n" + "Nombres: " + profExterno.getNombres() + "\n" + "Apellido paterno: " + profExterno.getApellidoPaterno() + "\n" + "Apellido materno: " + profExterno.getApellidoMaterno() + "\n" + "Bloque: " + profExterno.getBloque() + "\n" + "Calle: " + profExterno.getCalle() + "\n" + "Celular: " + profExterno.getCelular() + "\n"
                + "Comuna: " + profExterno.getComuna() + "\n" + "departamento: " + profExterno.getDepto() + "\n" + "Email: " + profExterno.getEmail() + "\n" + "Especialidad:" + profExterno.getEspecialidad() + "\n" + "Fecha nacimiento:" + profExterno.getFechaNac() + "\n" + "Lugar de trabajo: " + profExterno.getLugarDeTrabajo() + "\n" + "Número:" + profExterno.getNumero() + "\n" + "porcentaje:"
                + profExterno.getPorcentaje() + "\n" + "Provincia:" + profExterno.getProvincia() + "\n" + "Región:" + profExterno.getRegion() + "\n" + "Teléfono:" + profExterno.getTelefono();
        this.rutAnterior = profExterno.getRut();
        this.campoApellidoPaterno.setText(profExterno.getApellidoPaterno());
        this.campoApellidoMaterno.setText(profExterno.getApellidoMaterno());
        this.campoCelular.getCelular().setText(profExterno.getCelular());
        this.campoEspecialidad.setText(profExterno.getEspecialidad());
        this.campoEmail.getCorreo().setText(profExterno.getEmail());
        this.campoNombre.setText(profExterno.getNombres());
        this.campoRut.getRut().setText(profExterno.getRut());
        this.campoRut.getRut().setEditable(false);
        this.campoTelefono.getTelefono().setText(profExterno.getTelefono());
        this.campoInstitucion.setText(profExterno.getLugarDeTrabajo());


    }

    /**
     * Método que crea un objeto de tipo ProfesionalExterno seteando los campos
     * de acuerdo al profesional que se entrega como parametro.
     *
     * @param variable user de tipo service.ProfesionalExterno que contiene el
     * profesional a modificar.
     * @return devuelve el objeto de tipo service.ProfesionalExterno con los
     * campos requeridos.
     *
     */
    public service.ProfesionalExterno crearObjetoProfesionalExterno(service.ProfesionalExterno profExterno) {

        profExterno.setNombres(campoNombre.getText());
        profExterno.setApellidoPaterno(campoApellidoPaterno.getText());
        profExterno.setApellidoMaterno(campoApellidoMaterno.getText());
        profExterno.setCelular(campoCelular.getCelular().getText());
        profExterno.setEmail(campoEmail.getCorreo().getText());
        profExterno.setRut(campoRut.getRut().getText());
        profExterno.setTelefono(campoTelefono.getTelefono().getText());
        profExterno.setEspecialidad(campoEspecialidad.getText());
        profExterno.setActivo(true);
        profExterno.setLugarDeTrabajo(campoInstitucion.getText());


        return profExterno;


    }

    /**
     * Método que habilita o deshabilita los campos que se encuentran en el
     * formulario, de acuerdo a la opción que tenga como parámetro.
     *
     * @param variable opcion de tipo boolean, cuando es true se habilitan los
     * campos, en caso contrario se deshabilitan.
     *
     */
    public void habilitarCampos(boolean opcion) {

        this.campoApellidoPaterno.setEditable(opcion);
        this.campoApellidoMaterno.setEditable(opcion);
        this.campoCelular.getCelular().setEditable(opcion);
        this.campoEspecialidad.setEditable(opcion);
        this.campoEmail.getCorreo().setEditable(opcion);
        this.campoNombre.setEditable(opcion);
        this.campoRut.getRut().setEditable(opcion);
        this.campoTelefono.getTelefono().setEditable(opcion);
        this.campoInstitucion.setEditable(opcion);


    }

//    /**
//    * Método que exporta a PDF la información del usuario que se está visualizando.
//    **/
    public void exportarPDF() throws DocumentException, FileNotFoundException {


        Document document = new Document();
        String dirArchivo = eligeDireccionArchivo();
        if (!dirArchivo.equals(".pdf")) {
            /*Sección para hacer el pdf, el cuál queda guardado en escritorio con el nombre de ProfesionalExterno*/

            Font fondoTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 16, Font.BOLD);
            Font fondoSubTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dirArchivo));
            document.open();
            Paragraph p = new Paragraph("Información Profesional Externo", fondoTitulo);
            p.setFirstLineIndent(150);
            document.add(p);

            /*Datos Personales*/
            p = new Paragraph("Datos Personales", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosPersonales = new PdfPTable(2);
            tablaDatosPersonales.addCell("Rut");
            tablaDatosPersonales.addCell(campoRut.getRut().getText());
            tablaDatosPersonales.addCell("Nombres");
            tablaDatosPersonales.addCell(campoNombre.getText());
            tablaDatosPersonales.addCell("Apellido Paterno");
            tablaDatosPersonales.addCell(campoApellidoPaterno.getText());
            tablaDatosPersonales.addCell("Apellido Materno");
            tablaDatosPersonales.addCell(campoApellidoMaterno.getText());
            document.add(tablaDatosPersonales);


            /*Contacto*/
            p = new Paragraph("Contacto", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosContacto = new PdfPTable(2);
            if (!campoTelefono.getTelefono().getText().equals("")) {
                tablaDatosContacto.addCell("Teléfono");
                tablaDatosContacto.addCell(campoTelefono.getTelefono().getText());
            }
            if (!campoCelular.getCelular().getText().equals("")) {
                tablaDatosContacto.addCell("Celular");
                tablaDatosContacto.addCell(campoCelular.getCelular().getText());
            }
            if (!campoEmail.getCorreo().getText().equals("")) {
                tablaDatosContacto.addCell("E-mail");
                tablaDatosContacto.addCell(campoEmail.getCorreo().getText());
            }
            document.add(tablaDatosContacto);

            /*Información del Profesional*/
            p = new Paragraph("Información del Profesional", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaInfoProfesional = new PdfPTable(2);
            tablaInfoProfesional.addCell("Especialidad");
            tablaInfoProfesional.addCell(campoEspecialidad.getText());
            tablaInfoProfesional.addCell("Institución Proveniente");
            tablaInfoProfesional.addCell(campoInstitucion.getText());
            document.add(tablaInfoProfesional);


            document.close();
            abrirArchivo(dirArchivo);
        }
    }

    /**
     * Método en el cual se elige el directorio para exportar a PDF, con
     * jfileChooser.
     *
     * @return una variable de tipo String que contiene la dirección en donde se
     * almacenará el PDF.
     *
     */
    public String eligeDireccionArchivo() {
        String dirArchivo = "";
        JFileChooser jFileChooser1 = new JFileChooser();
        jFileChooser1.setDialogTitle("Guardar archivo:");
        jFileChooser1.setVisible(true);

        int r = jFileChooser1.showSaveDialog(null);
        if (r == JFileChooser.APPROVE_OPTION) {
            File file = jFileChooser1.getSelectedFile();
            dirArchivo = String.valueOf(file);
        }
        dirArchivo = dirArchivo.replace('\\', '/') + ".pdf";
        return dirArchivo;

    }

    /**
     * Método que abre el PDF de acuerdo a la dirección especificada.
     *
     * @param variable de tipo String que contiene la dirección necesaria para
     * abrir el documento.
     *
     */
    public void abrirArchivo(String direccion) {
        //Abre el documento pdf
        try {
            File file = new File(direccion);
            Desktop.getDesktop().open(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Método que valida los campos que se han ingresadoen el formulario,
     * emitiendo un mensaje de advertencia en caso de ser necesario. Estos
     * campos son telefono, email, celular, usuario, nombre, apellido paterno,
     * apellido materno, contraseña y rut.
     *
     * @return una variable de tipo boolean. Cuando es true, significa que son
     * validos los campos.
     *
     */
    public boolean validarCampos() {
        boolean hayContacto = false;

        if (!campoTelefono.getTelefono().getText().equals("")
                || !campoEmail.getCorreo().getText().equals("")
                || !campoCelular.getCelular().getText().equals("")) {
            hayContacto = true;
        }


        if (hayContacto
                && !campoEspecialidad.getText().equals("")
                && !campoNombre.getText().equals("")
                && !campoApellidoPaterno.getText().equals("") && !campoApellidoMaterno.getText().equals("")) {
            cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
            return true;
        }

        cambiarEtiquetaMensajeria(Mensajeria.mensajeCamposObligatorios(), Color.red);
        return false;
    }

    /**
     * Método que retorna el label en donde se dan a conocer los mensajes de
     * advertencia.
     *
     * @return variable de tipo JLabel.
     *
     */
    public JLabel getMensajesAdvertencia() {
        return mensajesAdvertencia;
    }

    public Rut getCampoRut() {
        return campoRut;
    }

    /**
     * Método que cambia el mensaje del diálogo de acuerdo a lo que se requiera.
     *
     * @param variable de tipo String con el mensaje
     * @param variable de tipo Color con el color del mensaje
     *
     */
    public void cambiarEtiquetaMensajeria(String mensaje, Color color) {
        this.mensajesAdvertencia.setText(mensaje);
        this.mensajesAdvertencia.setForeground(color);
    }

    /**
     * Aqui comienzan los métodos correspondientes a los servicios
     *
     */
    /**
     * Método que retorna la lista de Profesionales Externos que estan en la
     * Base de Datos, a través del servicio listarProfesionalesExternos.
     *
     * @return variable de tipo java.util.List<service.ProfesionalExterno> que
     * contiene la lista de profesionales externos.
     *
     */
    private static java.util.List<service.ProfesionalExterno> listarProfesionalesExternos() {
        service.ProfesionalExternoWSService service = new service.ProfesionalExternoWSService();
        service.ProfesionalExternoWS port = service.getProfesionalExternoWSPort();
        return port.listarProfesionalesExternos();
    }

    /**
     * Método que carga el profesional externo de la Base de Datos, a partir de
     * un rut y a través del servicio cargarProfesionalExterno.
     *
     * @param variable de tipo String correspondiente al rut profesional externo
     * a cargar.
     * @return variable de tipo Object que corresponde al ProfesionalExterno
     * cargado.
     *
     */
    private static Object cargarProfesionalExterno(java.lang.String rut) {
        service.ProfesionalExternoWSService service = new service.ProfesionalExternoWSService();
        service.ProfesionalExternoWS port = service.getProfesionalExternoWSPort();
        return port.cargarProfesionalExterno(rut);
    }

    /**
     * Método registra en la bitácora la acción realizada en el sistema
     *
     */
    private static Long registrar(service.Usuario usuario, java.lang.String modulo, java.lang.String accion, java.lang.String valorAnterior, java.lang.String valorNuevo) {
        service.BitacoraWSService service = new service.BitacoraWSService();
        service.BitacoraWS port = service.getBitacoraWSPort();
        return port.registrar(usuario, modulo, accion, valorAnterior, valorNuevo);
    }

    /**
     * Método que modifica el profesional externo que esta registrado en la Base
     * de Datos, a través del servicio modificarProfesionalExterno.
     *
     * @param variable de tipo service.ProfesionalExterno llamada arg0 que es el
     * profesional externo a modificar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) la actualización del profesional externo.
     *
     */
    private static boolean modificarProfesionalExterno(service.ProfesionalExterno profesional) {
        service.ProfesionalExternoWSService service = new service.ProfesionalExternoWSService();
        service.ProfesionalExternoWS port = service.getProfesionalExternoWSPort();
        return port.modificarProfesionalExterno(profesional);
    }

    /**
     * Método que registra el usuario en la Base de Datos, a través del servicio
     * agregarProfesionalExterno.
     *
     * @param variable de tipo service.ProfesionalExterno llamada arg0 que es el
     * profesionalExterno a registrar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) el regitro del profesional externo.
     *
     */
    private static boolean agregarProfesionalExterno(service.ProfesionalExterno profesional) {
        service.ProfesionalExternoWSService service = new service.ProfesionalExternoWSService();
        service.ProfesionalExternoWS port = service.getProfesionalExternoWSPort();
        return port.agregarProfesionalExterno(profesional);
    }

    private static Object cargarPrivilegios(java.lang.String rut) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.cargarPrivilegios(rut);
    }
}
